package main

import "fmt"

/**
  这个文件执行 输出结果是
	b =  1
	b1 =  2
	b1 =  3
	b1 =  4
	b1 =  5
	main
	运行原理：递归其实就是相当于我们在满足一个条件的情况下循环去调用同一个方法。以下方法可以理解为：我们有n个方法，执行的是同样的操作，就是打印接收的值。我们每调用一次这个方法传入的参数就会减一。当我们第一次调用函数是时候，是先调用了第二个函数，传入值是-1的，然后在打印，也就说要等第一个函数调用完第二个函数，第一个函数的打印才会执行，但第二个函数又在调用第三个函数，等第三个函数执行完了才能打印，以此类推，所有的打印都被延迟执行了，在等待自己方法内调用的其他方法执行完成，直到最后一个不满足循环的条件了，他会直接打印出来，打印完后，函数执行完成，他的上个函数调用完这个函数了，可以执行他自己的打印了，然后上上个也是这么执行，直到回到第一个函数哪里，所以我们的递归是先进后出的顺序。先进去的最后被执行完
 */

 /**
 	下边函数执行的顺序
 	main函数里调用back函数，传参是5
 	程序走到back里，b的值是5，5不等于1，所以往下走，下边是一个调用本身函数的操作，他会先去调用函数，所以下边的打印就被延迟执行了，要等调用完本身函数，传值是b-1,也就是4，
 	4还是不等于1，所以还是往下走，有是调用本身函数，此时的打印还是不能走，因为还要调用自身函数，一次类推，只要b不等于1，方法最后的打印都会被延迟，直到b=1了,打印完b,退出
 	之前被延迟的打印才会一步步走，其实就和普通函数连续调用是一个原理的
  */
func back(b int) {
	if b == 1 { //停止调用递归的条件
		fmt.Println("b = ", b)
		return
	}

	back(b - 1)
	fmt.Println("b1 = ", b)
	return
}

func main()  {
	back(5)
	fmt.Println("main")
}
